#include "main.h"
u16 lightcnt;
FIRE_t          fire_L,fire_R;
bool            sta_Lfire,sta_Rfire;
/***************************************/
/****************风机控制****************/
/***************************************/
void smoke_motor_ctrl(void)
{
    if(gb_TestFlag)
        return;
    /*风机上报故障处理*/
    {
        smoker.err_code  = 0;
    }

    if (smoker.level && (board.motoDly_sec == 0))
    {
        motor_cmd.mode0 = smoker.level;

    }
    else
    {

        motor_cmd.mode0 = 0;  
        uart_rest_err_tmr(&motor_comm); 
        motor_rx_err = 0;
    }
}

/******************************************************/
/******************************************************/
/**********************翻版电机任务*********************/
/******************************************************/
/******************************************************/
void boardPara_init(MotoPara_t *para)
{
    para->exist_f = 0;        //默认翻版不存在（在堵转条件里置1）
    para->dir_f = 0;          //翻版方向
    para->lock_cfm_10ms = 50; //堵转电流确认时间
    para->lock_i_10mA = 40;   //堵转电流值
    para->runMax_sec = 15;    //最大运行时间
    para->runMin_sec = 2;     //最小运行时间
    para->stopTime_10ms = 10; //中途切换时间（防止翻版突然换向）
    para->dly_sec = 5;        //等待风机启动时间（翻版延时开启）
    para->motoDly_sec = 5;    //风机等待翻版启动时间（防止啸叫）
}
//执行函数
static void board_on(void)
{
    if (boardPara.dir_f)
    {
        GPIO_WriteBit(PIN_BOAEG_IN1,0);
        GPIO_WriteBit(PIN_BOAEG_IN2,1);
    }
    else
    {
        GPIO_WriteBit(PIN_BOAEG_IN1,1);
        GPIO_WriteBit(PIN_BOAEG_IN2,0);      
    }
}
static void board_off(void)
{
    if (boardPara.dir_f)
    {
        GPIO_WriteBit(PIN_BOAEG_IN1, 1);
        GPIO_WriteBit(PIN_BOAEG_IN2,0);         
    }
    else
    {
        GPIO_WriteBit(PIN_BOAEG_IN1,0);
        GPIO_WriteBit(PIN_BOAEG_IN2,1);        
    }
}
static void board_stop(void)
{
    if (boardPara.dir_f)
    {
        GPIO_WriteBit(PIN_BOAEG_IN1,1);
        GPIO_WriteBit(PIN_BOAEG_IN2,1);         
    }
    else
    {
        GPIO_WriteBit(PIN_BOAEG_IN1,1);
        GPIO_WriteBit(PIN_BOAEG_IN2,1);         
    }
}
static void board_reset(void)
{
    if (boardPara.dir_f)
    {
        GPIO_WriteBit(PIN_BOAEG_IN1, 0);
        GPIO_WriteBit(PIN_BOAEG_IN2, 0); 
    }
    else
    {
        GPIO_WriteBit(PIN_BOAEG_IN1, 0);
        GPIO_WriteBit(PIN_BOAEG_IN2, 0); 
    }
}
/*
*Note:
* 1:board.cur_i_10mA 值由AD经转换得出，每个新项目要检验电流值采集是否准确。
* 2:在board.motoDly_sec非零时不发送给电机芯片档位
* 3:rec_board接收到的翻版指令   1：开翻版    0：关翻版
*/
void board_motor_ctrl(void)
{ //period = 10ms

    static u8 on_time = 0;  //打开运行时间 秒
    static u8 off_time = 0; //关闭运行时间 秒

    static u8 stop_time = 0;  //动作暂停时间
    static u8 dlyoff_sec = 0; // 延时关翻版倒计时

    static u8 old_cmd = 0; //上一个指令，用于瞬间判断
    static u8 old_level = 0; //上一个风机档位 用于瞬间判断
    static bool boardruning = 0;
    
    if(gb_TestFlag)
        return;
    //堵转检测
    if (board.cur_i_10mA >= boardPara.lock_i_10mA)
    {
        if (++board.lock_10ms > boardPara.lock_cfm_10ms)
        {
            board.lock_10ms = boardPara.lock_cfm_10ms;
            boardPara.exist_f = 1; //翻版电机默认不存在
            board.lock_f = 1;
        }
    }
    else
    {
        board.lock_10ms = 0;
        board.lock_f = 0;
    }

    //翻板与风机的延缓保护
    if (smoker.level && (!old_level)) //开风机瞬间
    {
        if (on_time == 0)
        { //翻版关闭状态或者正在关闭的路上
            if (boardPara.exist_f)
                board.motoDly_sec = boardPara.motoDly_sec; //风机等待时间
        }
    }
    if ((!smoker.level) && old_level) //关风机瞬间
    {
        if (off_time == 0)
        { //翻版打开状态或者在打开的路上
            if (boardPara.exist_f)
                dlyoff_sec = boardPara.dly_sec; // 翻版等待风机完全关断时间
        }
    }
    old_level = smoker.level;

    if (system_sec_f)
    {
        if (board.motoDly_sec) //这个值存在时不开启风机!!
            board.motoDly_sec--;
        if (dlyoff_sec)
            dlyoff_sec--;
    }

    //指令赋值
    if (dlyoff_sec == 0)
    { 
       // board.cmd = rec_board; //通讯函数里赋值
    }

    //动作变化等待
    if (board.cmd != old_cmd)
    {
        if( boardruning)
        {
            stop_time = boardPara.stopTime_10ms; // 动作暂停100ms
            boardruning = 0;
        }

        old_cmd = board.cmd;
    }

    if (stop_time)
    {
        stop_time--;
        board_stop();
        return;
    }

    //指令执行
    if (board.cmd == 1) //board on
    {
        off_time = 0;
        if (system_sec_f)
            on_time++;
        if ((on_time >= boardPara.runMax_sec) || board.lock_f) //停止条件:堵转或者到时间了
        {
            if (on_time < boardPara.runMin_sec)
            {
                board_on();
                boardruning = 1;
            }
            else
            {
                on_time = boardPara.runMax_sec;
                board_stop();
                boardruning = 0;
            }
        }
        else
        {
            board_on();
            boardruning = 1;
        }
    }
    else //board off
    {
        on_time = 0;
        if (system_sec_f)
            off_time++;
        if ((off_time >= boardPara.runMax_sec) || board.lock_f) //停止条件:堵转或者到时间了
        {
            if (off_time < boardPara.runMin_sec)
            {
                board_off();
                 boardruning = 1;
            }
            else
            {
                off_time = boardPara.runMax_sec;
                boardruning = 0;
                board_reset();
            }
        }
        else
        {
            boardruning = 1;
            board_off();
        }
    }
}
/******************************************************/
/******************************************************/
/**********************防火墙处理**********************/
/******************************************************/
/******************************************************/
void wall_deal(void)
{
	static u8 dly_sec = 0;
	if(wall_L.on_f || wall_R.on_f)//(tempr_max > wall_tempr[WALL_LEVEL])
	{
		if(system_sec_f)
		{
			dly_sec++;
		}
		//if(dly_sec >= 5)
		{//5秒后
			dly_sec = 5;
			if(sta_Lfire)
			    fireoff_L.cmd_flag = 1;
            if(sta_Rfire)
			    fireoff_R.cmd_flag = 1;
			
			smoker.level = 0;
			cut_stove_f = 1;
		}
	}else
	{
		dly_sec = 0;
	}
}

void light_ctrl(void)//10ms执行一次
{ 
//    static u16 temp = 0;
	static bool flag = 0;
    if(gb_TestFlag)
        return;
    if (light_f)
    {
        if (lightcnt < 200)
        {
            lightcnt ++;
        }
    }
    else
    {
        if (lightcnt> 0)
        {
            
            lightcnt --;
        }
    }
	if(lightcnt == 0)
	{
		T16Nx_MAT0Out0Config(T16N2, T16Nx_Out_Low); //
		T16Nx_MAT1Out0Config(T16N2, T16Nx_Out_Low); //
		T16Nx_SetCNT0(T16N1, 0);
		T16Nx_SetMAT0(T16N1, lightcnt);		
		flag = 0;
        
    }else if(lightcnt >= 200)
	{
		flag = 0;
		T16Nx_MAT0Out0Config(T16N2, T16Nx_Out_High); //
		T16Nx_MAT1Out0Config(T16N2, T16Nx_Out_High); //
		T16Nx_SetMAT0(T16N2, lightcnt);
    }else
	{
		
		if(flag == 0)
		{
			T16Nx_MAT0Out0Config(T16N2, T16Nx_Out_Low); //
			T16Nx_MAT1Out0Config(T16N2, T16Nx_Out_High); //			
		}
		T16Nx_SetCNT0(T16N2, 0);
		T16Nx_SetMAT0(T16N2, lightcnt);  
		flag = 1;
		
	}
}
/**************************************************
*函数名称：
*函数功能：
*入口参数：void
*出口参数：void  
**************************************************/
u8 fire_calculate(FIRE_t* fire)
{
	if(fire->sw_dn&&(fire->presw_dn != fire->sw_dn)&&(fire->xnsta != KNOB_CLOSE)) //冲阀状态下
	{
		fire->backup_ad = fire->thcp_ad;
		fire->sw_dn_tmr = 20*100; //20s之内
	}
    fire->presw_dn = fire->sw_dn;
	u16_dn(&fire->sw_dn_tmr);
	if(fire->sw_dn_tmr&&(fire->xnsta != KNOB_CLOSE))
	{
		if((fire->backup_ad+200)< fire->fade_limit)
		{
			fire->fade_limit = fire->backup_ad+200;
			if(fire->fade_limit >1800)
				fire->fade_limit = 1800;
			if(fire->fade_limit < 1600)
				fire->fade_limit = 1600;			
		}	
	}else
	{
	    fire->fade_limit = 1800;
        fire->sw_dn_tmr = 0;	
	}

		
	if (system_100ms_f) //检测时钟
	{
		if (fire->thcp_ad < 1469) //检测到火焰 FIRE_EXIST
		{
			u8_dn(&fire->exist_ct);
			if (!fire->exist_ct) 	fire->exist_f  = true;
		}else
		{
			fire->exist_ct = 10; //1s
		}


		if(fire->thcp_ad > fire->fade_limit)	//没检测到火焰 FIRE_EXIST
		{

			u8_dn(&fire->fade_ct);
			if (!fire->fade_ct)		fire->exist_f = false;
		}else
		{
			fire->fade_ct = 20; //2s
		}
	}
	return fire->exist_f;
}
void fire_valueinit(void)
{
    fire_L.fade_limit = 1800;
    fire_R.fade_limit = 1800;
    fire_L.presw_dn = 0;
    fire_R.presw_dn = 0;
}
